package calendar;

import gui.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
 * 
 * Klasse ein Set mit Terminen zur�ckgeben kann.
 * 
 * @author Michael Weng
 * 
 * 
 * 
 */
public class EventSet {

	private static ResultSet rs = null;
	private Connection connection = Test.getConnection();

	/**
	 * Verbindet zur Datenbank
	 */
//	public boolean connect() {
//
//		try {
//			Class.forName("com.mysql.jdbc.Driver");
//			connection = DriverManager
//					.getConnection("jdbc:mysql://win9142.informatik.uni-wuerzburg.de:3306?user=awesomefireballs&password=jesus");
//
//		} catch (ClassNotFoundException e) {
//
//			e.printStackTrace();
//		} catch (SQLException e) {
//
//			e.printStackTrace();
//			return false;
//		}
//
//		return true;
//	}

	/**
	 * Konstruktor. Verbindet zur Datenbank und schreibt alle Tasks in das
	 * Resultset.
	 */

	public EventSet() {

		try {
			Statement stat;
			stat = connection.createStatement();

			stat.executeQuery("use `sopra-ws12-awesome_fireballs`;");

			rs = stat
					.executeQuery("SELECT Events.*  FROM Calendar, Events, User WHERE Events.idCalendar = Calendar.idCalendar AND Calendar.idUser = User.idUser AND User.idUser = "
							+ Test.iduser
							+ " AND Calendar.accepted = 1 GROUP BY Events.idEvents");
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	/**
	 * Getter für das Resultset.
	 * 
	 * @return rs ResultSet, in dem alle Tasks stehen.
	 */

	public ResultSet getResultSet() {
		return rs;
	}

	/**
	 * 
	 * Ruft Konstruktor auf (der sich mit der Datenbank verbindet und alle Tasks
	 * in das result Set schreibt) und gibt alle Tasks in einer ArrayList
	 * zurueck, dessen Enddatum mit dem übergebenen Date übereinstimmt.
	 * 
	 * @param d
	 *            übergebenes Datum. DIESES SOLLTE DAS FORMAT y-1900, m-1, d
	 *            HABEN!
	 * @return ArrayList mit "MyTask"s
	 * @throws NumberFormatException
	 * @throws SQLException
	 * @throws ParseException
	 */

	@SuppressWarnings("deprecation")
	public static List<Event> getTasks(ResultSet rset, Date d)
			throws NumberFormatException, SQLException, ParseException {

		List<Event> list = new ArrayList<Event>();

		rset.absolute(1);
		do {

			if (rset.getRow() > 0) {
				SimpleDateFormat sdf = new SimpleDateFormat(
						"yyyy-MM-dd HH:mm:ss");

				Date startdate = sdf.parse(rset.getString(4));
				Date enddate = sdf.parse(rset.getString(5));

				// Wenn Datum Stimmtinnerhalb des Zeitraums liegt.
				if ((d.after(startdate) && d.before(enddate))
						|| ((d.getYear() == enddate.getYear())
								&& (d.getMonth() == enddate.getMonth()) && (d
								.getDate() == enddate.getDate()))
						|| ((d.getYear() == startdate.getYear())
								&& (d.getMonth() == startdate.getMonth()) && (d
								.getDate() == startdate.getDate()))) {

					int eventID = Integer.parseInt(rset.getString(1));
					int calendarID = Integer.parseInt(rset.getString(2));
					String name = rset.getString(3);
					String ort = rset.getString(6);
					String description = rset.getString(7);

					try {
						LinkedList<Integer> calids = getCalIds();

						for (int i = 0; i < calids.size(); i++) {

							if (calids.get(i) == calendarID) {
								Event termin = new Event(eventID, calendarID,
										name, startdate, enddate, ort,
										description);
								list.add(termin);
							}

						}

					} catch (ClassNotFoundException e) {
						e.printStackTrace();
					}

				}

			}
		} while (rset.next());

		return list;

	}

	/**
	 * Gibt Liste zurueck mit zu Events zugehöerigen Kalendern
	 * 
	 * @return
	 * @throws SQLException
	 * @throws ClassNotFoundException
	 */
	public static LinkedList<Integer> getCalIds() throws SQLException,
			ClassNotFoundException {

		Class.forName("org.sqlite.JDBC");
		Connection conn = DriverManager
				.getConnection("jdbc:sqlite:checkids.db");
		Statement stat2 = conn.createStatement();

		ResultSet rs2 = stat2.executeQuery("select * from ids;");

		LinkedList<Integer> ids = new LinkedList<Integer>();

		while (rs2.next()) {
			ids.add(rs2.getInt("id"));

		}

		return ids;
	}
}
